package pe.com.lgutierrez.campeonato.dao.mysql.sjdbc;

import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import pe.com.lgutierrez.campeonato.dao.JugadorDao;
import pe.com.lgutierrez.campeonato.entidad.Jugador;

@Repository
public class JugadorDaoImpl  implements JugadorDao{

	private JdbcTemplate jdbcTemplate;
	private static final String QUERYINSERTJUGADORES = "INSERT INTO JUGADORES(codigoJugador,primerNombreJugador,segundoNombreJugador," +
			"apellidoPaternoJugador,apellidoMaternoJugador,fechaNacimientoJugador," +
			"nacionalidad,nacionalizado,peso,estatura,sexo,fechaInserccion,fechaModificacion,estado)" +
			" VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
	private static final String QUERYSELECTJUGADORES = "SELECT codigoJugador,primerNombreJugador,segundoNombreJugador," +
			"apellidoPaternoJugador,apellidoMaternoJugador,fechaNacimientoJugador," +
			"nacionalidad,nacionalizado,peso,estatura,sexo FROM JUGADORES";
	
	private static final String WHERE = " WHERE";
	private static final String CONDICIONIDJUGADOR = " idJugador = ?";
	
	@Autowired
	public void setJdbcTemplate(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	public void insertarJugador(Jugador jugador) {
		// TODO Auto-generated method stub
		jdbcTemplate.update(QUERYINSERTJUGADORES, new Object[]{jugador.getCodigoJugador(),jugador.getPrimerNombre(),
						jugador.getSegundoNombre(),jugador.getApellidoPaterno(),jugador.getApellidoMaterno(),
						jugador.getFechaNacimiento(),jugador.getNacionalidad(),jugador.getNacionalizado(),
						jugador.getPeso(),jugador.getEstatura(),jugador.getSexo()});
		
	}

	public void modificarJugador(Jugador jugador) {
		// TODO Auto-generated method stub
		
	}

	public void eliminarJugador(Integer codigoJugador) {
		// TODO Auto-generated method stub
		
	}

	public List<Jugador> obtenerJugadores() {
		// TODO Auto-generated method stub
		List<Jugador> jugadores = jdbcTemplate.query(QUERYSELECTJUGADORES, new MapperJugador());
		return jugadores;
	}

	public Jugador obtenerJugador(Integer codigoJugador) {
		// TODO Auto-generated method stub
		Jugador jugador = jdbcTemplate.queryForObject(QUERYSELECTJUGADORES + WHERE + CONDICIONIDJUGADOR,
							new Object[]{codigoJugador},new MapperJugador());
		return jugador;
	}

	public static final class MapperJugador implements RowMapper<Jugador>{

		
		public Jugador mapRow(ResultSet rs, int arg1) throws SQLException {
			Jugador jugador = new Jugador();
			jugador.setCodigoJugador(rs.getString("codigoJugador").trim());
			jugador.setApellidoPaterno(rs.getString("apellidoPaternoJugador").trim());
			jugador.setApellidoMaterno(rs.getString("apellidoMaternoJugador").trim());
			jugador.setPrimerNombre(rs.getString("primerNombreJugador").trim());
			jugador.setSegundoNombre(rs.getString("segundoNombreJugador"));
			jugador.setEstatura(rs.getDouble("estatura"));
			jugador.setPeso(rs.getDouble("peso"));
			jugador.setNacionalidad(rs.getString("nacionalidad"));
			jugador.setNacionalizado(rs.getBoolean("nacionalizado"));
			jugador.setSexo(rs.getBoolean("sexo"));
			jugador.setFechaNacimiento(rs.getDate("fechaNacimientoJugador"));
			
			
			return jugador;
		}
		
	}
	
	public int[] actualizarJugadores(final List<Jugador> jugadores) {
		
		if(jugadores.size()>0) {
			for(Jugador jugador : jugadores) {
				System.out.println(" jugador : " + jugador);
			}
		}
		
		// TODO Auto-generated method stub
		int[] res = jdbcTemplate.batchUpdate(QUERYINSERTJUGADORES, new BatchPreparedStatementSetter() {
			
			public void setValues(PreparedStatement ps, int i) throws SQLException {
				 ps.setString(1, jugadores.get(i).getCodigoJugador());
	             ps.setString(2, jugadores.get(i).getPrimerNombre());
	             ps.setString(3, jugadores.get(i).getSegundoNombre());
	             ps.setString(4, jugadores.get(i).getApellidoPaterno());
	             ps.setString(5, jugadores.get(i).getApellidoMaterno());
	             Date date = new Date(jugadores.get(i).getFechaNacimiento().getTime());
	             ps.setDate(6, date);
	             ps.setString(7, jugadores.get(i).getNacionalidad());
	             ps.setBoolean(8, jugadores.get(i).getNacionalizado());
	             ps.setDouble(9, jugadores.get(i).getPeso());
	             ps.setDouble(10, jugadores.get(i).getEstatura());
	             ps.setBoolean(11, jugadores.get(i).getSexo());
	             ps.setDate(12, new Date(new java.util.Date().getTime()));
	             ps.setDate(13, new Date(new java.util.Date().getTime()));
	             ps.setString(14, "1");
				
			}
			
			public int getBatchSize() {
				// TODO Auto-generated method stub
				return jugadores.size();
			}
		});
		
		return res;
	}

	public int obtenerCantidadJugadores() {
		// TODO Auto-generated method stub
		String sql = "select count(1) from jugadores";
		return jdbcTemplate.queryForInt(sql);
	}

	public Long obtenerUltimoIdJugador() {
		// TODO Auto-generated method stub
		String sql = "select max(idjugador) from jugadores;";
		return jdbcTemplate.queryForLong(sql);
		
	}
}
